/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package diseño09.controles;

import diseño09.entidades.Administrador;
import diseño09.entidades.Calificacion;
import diseño09.entidades.Club;
import diseño09.entidades.EquipoFantasia;
import diseño09.entidades.Fecha;
import diseño09.entidades.Historial;
import diseño09.entidades.ItemGanador;
import diseño09.entidades.Jugador;
import diseño09.entidades.Participante;
import diseño09.entidades.Partido;
import diseño09.entidades.Periodista;
import diseño09.entidades.PeriodoDeVeda;
import diseño09.entidades.Persona;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Vector;

/**
 *
 * @author aguwolky
 */
public class GestorDeBaseDeDatos {


    public static void main(String[] args){

        GestorDeBaseDeDatos gestor=new GestorDeBaseDeDatos();
        Connection con=gestor.Conectar();
        gestor.consulta(con);
        gestor.Desconectar(con);
    }

    private boolean  consulta(Connection conn)  {
      try {
         Statement s = (Statement) conn.createStatement();
         // hacer una consulta
         ResultSet rs = s.executeQuery("SELECT * " +
                                       "FROM persona p ;");

         while(rs.next())
             System.out.println(rs.getInt("id_persona")+" "+rs.getString("apellido")+" "+rs.getString("nombre")+" "+
                rs.getLong("nroDocumento")+" "+rs.getString("contrasenia")+" "+rs.getString("sexo").charAt(0)+" "+
                rs.getString("tipoDocumento")+" "+ rs.getString("fechaNacimiento")+" "+
                rs.getString("calle")+" "+rs.getInt("numero")+" "+rs.getInt("piso")+" "+rs.getInt("manzana")+" "+rs.getInt("depto")+" "+
                rs.getString("email")+" "+ rs.getString("fechaRegistro")+" "+ rs.getString("horaRegistro"));

         // cerrar la conexion..
         conn.close();

      } catch (SQLException ex){
         ex.printStackTrace();
         return false;

      }
      return true;
   }

    public Connection Conectar(){
        Connection con = null;

      try {

         // drive name es el paquete de java donde esta el manejador de la conexion
         String driverName = "com.mysql.jdbc.Driver"; // MySQL MM JDBC driver
         Class.forName(driverName);

         // Create a connection to the database
         String serverName = "localhost";
         String mydatabase = "disenio09"; //esquema de la DB
         String url = "jdbc:mysql://" + serverName + "/" + mydatabase; // a JDBC url
         String username = "root";
         String password = "disenio09";
         con = (Connection) DriverManager.getConnection(url, username, password);


         if (!con.isClosed()) {
            System.out.println("Successfully connected to " +
                    "MySQL server using TCP/IP...");
         }
      } catch (Exception e) {
         System.err.println("Exception: " + e.getMessage());
      }
        return con;
    }

    public void Desconectar(Connection con){
        try {
            if (con != null) {
               con.close();
            }
         } catch (SQLException e) {
             System.err.println("Exception: " + e.getMessage());
         }
    }

    public void persistirEquipoFantasia(EquipoFantasia unEquipoFantasia, Participante unParticipante){
        Connection con=Conectar();

        //Consulta
        try {
         Statement s = (Statement) con.createStatement();
         // hacer una consulta

         s.executeUpdate("insert into equipofantasia " +
                 "values("+unEquipoFantasia.getID()+", '"+unEquipoFantasia.getHoraCreacion()+
                 "', '"+unEquipoFantasia.getFechaCreacion()+"', \""+unEquipoFantasia.getNombre()+
                 "\", "+unEquipoFantasia.getTransferenciasRestantes()+", "+unParticipante.getID()+
                 ", "+unEquipoFantasia.getPuntajeTotal()+", "+unEquipoFantasia.getPresupuesto()+");");

         // cerrar la conexion..
         con.close();

         } catch (SQLException ex){
            ex.printStackTrace();
            }

        //Desconeccion
        Desconectar(con);
    }

    public void persistirPeriodoDeVeda(PeriodoDeVeda unPeriodoDeVeda){

    }

    public void persistirCalificacion(Calificacion unaCalificacion){

    }

    public Participante instanciarParticipante(long unNumeroDocumento){
        Participante a=null;

        Connection con=Conectar();

        //Consulta
        try {
         Statement s = (Statement) con.createStatement();
         // hacer una consulta
         ResultSet rs = s.executeQuery("SELECT * " +
                                       "FROM persona p " +
                                       "WHERE p.nroDocumento= "+unNumeroDocumento+";");

         rs.first();

         a=new Participante(rs.getInt("id_persona"),rs.getString("apellido"), rs.getString("nombre"),
                rs.getLong("nroDocumento"), rs.getString("contrasenia"), rs.getString("sexo").charAt(0),
                rs.getString("tipoDocumento"), rs.getString("fechaNacimiento"),
                rs.getString("calle")+" "+rs.getInt("numero")+" "+rs.getInt("piso")+" "+rs.getInt("manzana")+" "+rs.getInt("depto"),
                rs.getString("email"), rs.getString("fechaRegistro"), rs.getString("horaRegistro"));


         // cerrar la conexion..
         con.close();

         } catch (SQLException ex){
            ex.printStackTrace();
            }

        //Desconeccion
        Desconectar(con);

        String nombre=obtenerNombreEquipoFantasia(a.getID());

        a.setNombreEquipo(nombre);

        return a;

    }

    public Administrador instanciarAdministrador(long unNumeroDocumento){
        Connection con=Conectar();

        Administrador a=null;

        int tam=0;

        //Consulta
        try {
         Statement s = (Statement) con.createStatement();
         // hacer una consulta
         ResultSet rs = s.executeQuery("SELECT * " +
                                       "FROM persona p " +
                                       "WHERE p.nroDocumento= "+unNumeroDocumento+";");

         rs.first();
         a=new Administrador(rs.getInt("id_persona"),rs.getString("apellido"), rs.getString("nombre"),
                rs.getLong("nroDocumento"), rs.getString("contrasenia"), rs.getString("sexo").charAt(0),
                rs.getString("tipoDocumento"), rs.getString("fechaNacimiento"),
                rs.getString("calle")+" "+rs.getInt("numero")+" "+rs.getInt("piso")+" "+rs.getInt("manzana")+" "+rs.getInt("depto"),
                rs.getString("email"), rs.getString("fechaRegistro"), rs.getString("horaRegistro"));

         // cerrar la conexion..
         con.close();

         } catch (SQLException ex){
            ex.printStackTrace();
            }

        //Desconeccion
        Desconectar(con);

        return a;
    }

    public Periodista instanciarPeriodista(long unNumeroDocumento){
        Connection con=Conectar();

        Periodista a=null;

        int tam=0;

        //Consulta
        try {
         Statement s = (Statement) con.createStatement();
         // hacer una consulta
         ResultSet rs = s.executeQuery("SELECT * " +
                                       "FROM persona p " +
                                       "WHERE p.nroDocumento= "+unNumeroDocumento+";");

         rs.first();
         a=new Periodista(rs.getInt("id_persona"),rs.getString("apellido"), rs.getString("nombre"),
                rs.getLong("nroDocumento"), rs.getString("contrasenia"), rs.getString("sexo").charAt(0),
                rs.getString("tipoDocumento"), rs.getString("fechaNacimiento"),
                rs.getString("calle")+" "+rs.getInt("numero")+" "+rs.getInt("piso")+" "+rs.getInt("manzana")+" "+rs.getInt("depto"),
                rs.getString("email"), rs.getString("fechaRegistro"), rs.getString("horaRegistro"));

         // cerrar la conexion..
         con.close();

         } catch (SQLException ex){
            ex.printStackTrace();
            }

        //Desconeccion
        Desconectar(con);

        return a;

    }

    public EquipoFantasia instanciarEquipoFantasia(String unNombreEquipoFantasia){
        EquipoFantasia a=null;

        Connection con=Conectar();

        //Consulta
        try {
         Statement s = (Statement) con.createStatement();

         // hacer una consulta
         ResultSet rs = s.executeQuery("SELECT * FROM equipofantasia e " +
                                        "WHERE e.nombre= '"+unNombreEquipoFantasia+"';");

         rs.first();
         a=new EquipoFantasia(rs.getInt("id_equipo"), rs.getString("nombre"), rs.getString("fechaCreacion"),
                 rs.getString("horaCreacion"), rs.getInt("cambiosDisponibles"), rs.getInt("puntajeTotal"));

         // cerrar la conexion..
         con.close();

         } catch (SQLException ex){
            ex.printStackTrace();
            }

        //Desconeccion
        Desconectar(con);

        return a;

    }

    public PeriodoDeVeda instanciarPeriodoDeVeda(Fecha unaFecha){
        //Conección
        Connection con=Conectar();

        PeriodoDeVeda a=null;

        //Consulta
        try {
         Statement s = (Statement) con.createStatement();
         // hacer una consulta
         ResultSet rs = s.executeQuery("SELECT * FROM periododeveda p " +
                                       "WHERE p.id_fecha= "+unaFecha.getID()+";");

         rs.first();
         a=new PeriodoDeVeda(rs.getInt("id_periodo"),rs.getString("fechaInicio"),
                 rs.getString("fechaFin"),rs.getString("horaInicio"),rs.getString("horaFin"));

         // cerrar la conexion..
         con.close();

         } catch (SQLException ex){
            ex.printStackTrace();
            }

        //Desconeccion
        Desconectar(con);

        return a;
    }

    public Fecha instanciarFecha(int estadoFecha){
        //Conección
        Connection con=Conectar();
        
        Fecha a=null;

        //Consulta
        try {
         Statement s = (Statement) con.createStatement();
         // hacer una consulta
         ResultSet rs = s.executeQuery("SELECT * FROM fecha f " +
                                       "WHERE estado ="+estadoFecha+" " +
                                       "ORDER BY numero DESC;");

         rs.first();
         a=new Fecha(rs.getInt("id_fecha"),rs.getInt("numero"),rs.getInt("estado"));

         // cerrar la conexion..
         con.close();

         } catch (SQLException ex){
            ex.printStackTrace();
            }

        //Desconeccion
        Desconectar(con);

        return a;
    }

    public Partido instanciarPartido(String unLocal, String unVisitante, int unaFecha){
        Partido a=null;
        return a;

        //HACERRRRRRRRR!!!!!!!!!
    }

    public Club[] instanciarClubes(){
        //Conección
        Connection con=Conectar();

        Club[] clubes=new Club[20];

        //Consulta
        try {
         Statement s = (Statement) con.createStatement();
         // hacer una consulta
         ResultSet rs = s.executeQuery("SELECT * FROM club c order by nombreC;");

         int i=0;
         // mientras hay elementos en el resultado de la consulta.
         while(rs.next()){
            Club c=new Club(rs.getInt("id_club"),rs.getString("nombreC"));
            clubes[i]=c;
            i++;
         }

         // cerrar la conexion..
         con.close();

         } catch (SQLException ex){
            ex.printStackTrace();
            }

        //Desconeccion
        Desconectar(con);

        return clubes;

    }

    public Jugador[] instanciarJugadores(String unClub, int unaPosicion, int unaCotMinima,
            int unaCotMaxima){
        Connection con=Conectar();

        Jugador[] jugadores=null;

        //Preparo parte de la consulta segunlos parametros
        String consultaEquipo;
        String consultaPosicion;

        if(unClub.equals("*"))
            consultaEquipo="";
        else
            consultaEquipo="AND c.nombreC= '" +unClub+"' ";

        if(unaPosicion==0)
            consultaPosicion="";
        else
            consultaPosicion="AND j.puesto= "+unaPosicion+" ";

        //Consulta
        try {
         Statement s = (Statement) con.createStatement();
         // hacer una consulta
             ResultSet rs = s.executeQuery("SELECT * " +
                                           "FROM jugador j, club c " +
                                           "WHERE j.id_club=c.id_club " +
                                                  consultaPosicion +
                                                  consultaEquipo +
                                                  "AND j.cotizacion BETWEEN "+unaCotMinima+" AND "+unaCotMaxima+
                                           " GROUP BY c.nombreC,j.puesto,j.apellido,j.nombre");

             int tam=0;
             while(rs.next())
                tam++;
             if(tam==0)
                 return null;
             
             jugadores=new Jugador[tam];

             rs.first();

             int i=0;
               // mientras hay elementos en el resultado de la consulta.
             do{
                Club c=new Club(rs.getInt("id_club"),rs.getString("nombreC"));
                Jugador j=new Jugador(rs.getInt("id_jugador"),rs.getString("nombre"),rs.getString("apellido"),c,rs.getInt("puesto"),rs.getInt("cotizacion"));
                jugadores[i]=j;
                i++;
            }while(rs.next());

         // cerrar la conexion..
         con.close();

         } catch (SQLException ex){
            ex.printStackTrace();
            }

        //Desconeccion
        Desconectar(con);

        return jugadores;

    }

    public Fecha[] instanciarFechasCerradas(){
        Connection con=Conectar();

        Fecha[] fechasCerradas=null;

        //Consulta
        try {
         Statement s = (Statement) con.createStatement();
         // hacer una consulta


         ResultSet rs = s.executeQuery("SELECT * FROM fecha f " +
                                       "WHERE f.estado=0 ;");

         int tam=0;
         while(rs.next())
             tam++;

         fechasCerradas=new Fecha[tam];
         rs.first();
         int i=0;
         while(rs.next())
             fechasCerradas[i]=new Fecha(rs.getInt("id_fecha"),rs.getInt("numero"), rs.getInt("estado"));

         // cerrar la conexion..
         con.close();

         } catch (SQLException ex){
            ex.printStackTrace();
            }

        //Desconeccion
        Desconectar(con);

        return fechasCerradas;
    }

    public void persistirFecha(Fecha unaFecha){
        Connection con=Conectar();

        //Consulta
        try {
         Statement s = (Statement) con.createStatement();

         // hacer una consulta
         s.executeUpdate("insert into fecha " +
                         "values("+unaFecha.getID()+", "+unaFecha.getNumeroFecha()+", " +
                         unaFecha.getEstado()+");");


         // cerrar la conexion..
         con.close();

         } catch (SQLException ex){
            ex.printStackTrace();
            }

        //Desconeccion
        Desconectar(con);
    }

    public Historial[] obtenerHistorialesVigentes(EquipoFantasia unEquipoFantasia){
        Connection con=Conectar();

        Historial[] historiales=new Historial[15];

        //Consulta
        try {
         Statement s = (Statement) con.createStatement();
         // hacer una consulta


         ResultSet rs = s.executeQuery("SELECT * FROM historial h " +
                                       "WHERE h.id_fechaFinal is null AND h.id_equipo= "+unEquipoFantasia.getID()+
                                       " ORDER BY h.posicion;");

         int i=0;
         while(rs.next()){
            // System.out.println(rs.getInt("id_jugador")+" "+rs.getInt("id_equipo")+" "+rs.getInt("posicion"));
             Fecha fecha=obtenerFechaPorId(rs.getInt("id_fechaInicial"));
             Historial h=new Historial(rs.getInt("id_jugador"),fecha,rs.getInt("id_equipo"),rs.getInt("posicion"));
             historiales[i]=h;
             i++;
         }


         // cerrar la conexion..
         con.close();

         } catch (SQLException ex){
            ex.printStackTrace();
            }

        //Desconeccion
        Desconectar(con);

        return historiales;
        
    }

    public Jugador instanciarJugador(int idJugador){
        Connection con=Conectar();

        Jugador jugador=null;

        //Consulta
        try {
         Statement s = (Statement) con.createStatement();
         // hacer una consulta


         ResultSet rs = s.executeQuery("SELECT * FROM jugador j " +
                                       "WHERE j.id_jugador= "+idJugador+";");

         rs.first();
         Club club=obtenerClub(idJugador);
         jugador=new Jugador(idJugador,rs.getString("nombre"), rs.getString("apellido"),
                 club, rs.getInt("puesto"), rs.getInt("cotizacion"));

         // cerrar la conexion..
         con.close();

         } catch (SQLException ex){
            ex.printStackTrace();
            }

        //Desconeccion
        Desconectar(con);

        return jugador;
    }

    public Club instanciarClub(int idClub){
        Connection con=Conectar();

        Club club=null;

        //Consulta
        try {
         Statement s = (Statement) con.createStatement();
         // hacer una consulta
         ResultSet rs = s.executeQuery("SELECT * FROM club c " +
                                       "WHERE c.id_club= "+idClub+";");

         rs.first();
         club=new Club(rs.getInt("id_club"),rs.getString("nombreC"));

         // cerrar la conexion..
         con.close();

         } catch (SQLException ex){
            ex.printStackTrace();
            }

        //Desconeccion
        Desconectar(con);

        return club;
    }

    public void persistirHistoriales(Historial[] unArrayHistoriales){
        Connection con=Conectar();

        //Consulta
        try {
         Statement s = (Statement) con.createStatement();
         // hacer una consulta
         for(int i=0; i<unArrayHistoriales.length; i++)
             if(unArrayHistoriales[i]!=null)
                if(unArrayHistoriales[i].getFechaFin()==null)
                    s.executeUpdate("insert into historial " +
                        "values ( "+unArrayHistoriales[i].getIdJugador()+", "
                        +unArrayHistoriales[i].getIdEquipoFantasia()+", "
                        +unArrayHistoriales[i].getFechaInicio().getID()+", null, " +
                        +unArrayHistoriales[i].getPosicion()+");");
                else
                     s.executeUpdate("insert into historial " +
                        "values ( "+unArrayHistoriales[i].getIdJugador()+", "
                        +unArrayHistoriales[i].getIdEquipoFantasia()+", "
                        +unArrayHistoriales[i].getFechaInicio().getID()+", "
                        +unArrayHistoriales[i].getFechaFin().getID()+", " +
                        +unArrayHistoriales[i].getPosicion()+");");

         // cerrar la conexion..
         con.close();

         } catch (SQLException ex){
            ex.printStackTrace();
            }

        //Desconeccion
        Desconectar(con);
    }

    public String[] obtenerProvincias(){
        Connection con=Conectar();

        String[] provincias=new String[23];

        //Consulta
        try {
         Statement s = (Statement) con.createStatement();
         // hacer una consulta
         ResultSet rs = s.executeQuery("SELECT * FROM provincia p order by nombreProvincia;");

         int i=0;
         // mientras hay elementos en el resultado de la consulta.
         while(rs.next()){
            String provincia= rs.getString("nombreProvincia");
            provincias[i]=provincia;
            i++;
         }

         // cerrar la conexion..
         con.close();

         } catch (SQLException ex){
            ex.printStackTrace();
            }

        //Desconeccion
        Desconectar(con);

        return provincias;

    }

    public void persistirParticipante(int idPersona,String unApellido, String unNombre, Long unDocumento,
            String unaContrasenia, char unSexo, String unTipoDocumento, String unaFechaNacimiento,
            String unaCalle,Integer unNroCalle, Integer unNroDepto, Integer unPiso,
            Integer unaManzana, String unEMail, String fechaRegistro, String horaRegistro,
            String provincia, String localidad){

        int idProv=obtenerIdProvincia(provincia);

        Connection con=Conectar();

        //Consulta
        try {
         Statement s = (Statement) con.createStatement();
         // hacer una consulta

         s.executeUpdate("insert into persona " +
                 "values("+idPersona+", \""+unNombre+"\", \""+unApellido+"\", \""+unTipoDocumento+"\", "
                 +unDocumento+", \""+unaContrasenia+"\", \""+unEMail+"\", '"+unaFechaNacimiento+"', \""
                 +unSexo+"\", "+idProv+", \""+localidad+"\", \""+unaCalle+"\", "+unNroCalle+", "
                 +unPiso+", "+unaManzana+", "+unNroDepto+", '"+horaRegistro+"', '"+fechaRegistro+"');");


         s.executeUpdate("insert into participante " +
                         "values( "+idPersona+" );");

         // cerrar la conexion..
         con.close();

         } catch (SQLException ex){
            ex.printStackTrace();
            }

        //Desconeccion
        Desconectar(con);

    }

    private int obtenerIdProvincia(String provincia) {
        Connection con=Conectar();
        
        int id=0;

        //Consulta
        try {
         Statement s = (Statement) con.createStatement();
         // hacer una consulta
         ResultSet rs = s.executeQuery("SELECT id_provincia FROM provincia p " +
                                        "WHERE nombreProvincia= '"+provincia+"';");

         rs.next();
         id=rs.getInt("id_provincia");

         // cerrar la conexion..
         con.close();

         } catch (SQLException ex){
            ex.printStackTrace();
            }

        //Desconeccion
        Desconectar(con);

        return id;
    }

    public int obtenerNuevoIdPersona() {
        Connection con=Conectar();

        int id=0;

        //Consulta
        try {
         Statement s = (Statement) con.createStatement();
         // hacer una consulta
         ResultSet rs = s.executeQuery("SELECT MAX(id_persona) 'id_persona' " +
                                       "FROM persona p ;");

         int tam=0;
             while(rs.next())
                tam++;

         if(tam==0)
             id=1;
         else{
             rs.first();
             id=rs.getInt("id_persona")+1;
         }

         // cerrar la conexion..
         con.close();

         } catch (SQLException ex){
            ex.printStackTrace();
            }

        //Desconeccion
        Desconectar(con);

        return id;
    }

    public int obtenerNuevoIdEquipoFantasia() {
        Connection con=Conectar();

        int id=0;

        //Consulta
        try {
         Statement s = (Statement) con.createStatement();
         // hacer una consulta
         ResultSet rs = s.executeQuery("SELECT MAX(id_equipo) 'id_equipo' " +
                                       "FROM equipofantasia p ;");

         int tam=0;
             while(rs.next())
                tam++;

         if(tam==0)
             id=1;
         else{
             rs.first();
             id=rs.getInt("id_equipo")+1;
         }

         // cerrar la conexion..
         con.close();

         } catch (SQLException ex){
            ex.printStackTrace();
            }

        //Desconeccion
        Desconectar(con);

        return id;
    }

    public boolean verificarNombreRepetido(String nombre,String tabla, String atributo) {
        Connection con=Conectar();

        int tam=0;
        
        //Consulta
        try {
         Statement s = (Statement) con.createStatement();
         // hacer una consulta
         ResultSet rs = s.executeQuery("SELECT * " +
                                       "FROM "+tabla+" t " +
                                       "WHERE t."+atributo+"= '"+nombre+"';");

         while(rs.next())
             tam++;

         // cerrar la conexion..
         con.close();

         } catch (SQLException ex){
            ex.printStackTrace();
            }

        //Desconeccion
        Desconectar(con);

        if(tam!=0)
             return true;
         else
             return false;

    }

    public Persona instanciarPersona(long unNumeroDocumento) {
        Connection con=Conectar();

        Persona p=null;

        int tam=0;

        //Consulta
        try {
         Statement s = (Statement) con.createStatement();
         // hacer una consulta
         ResultSet rs = s.executeQuery("SELECT * " +
                                       "FROM persona p " +
                                       "WHERE p.nroDocumento= "+unNumeroDocumento+";");

         while(rs.next())
             tam++;

        if(tam!=0){
            rs.first();
            p=new Persona(rs.getInt("id_persona"),rs.getString("apellido"), rs.getString("nombre"), 
                rs.getLong("nroDocumento"), rs.getString("contrasenia"), rs.getString("sexo").charAt(0),
                rs.getString("tipoDocumento"), rs.getString("fechaNacimiento"),
                rs.getString("calle")+" "+rs.getInt("numero")+" "+rs.getInt("piso")+" "+rs.getInt("manzana")+" "+rs.getInt("depto"),
                rs.getString("email"), rs.getString("fechaRegistro"), rs.getString("horaRegistro"));
        }
        

         // cerrar la conexion..
         con.close();

         } catch (SQLException ex){
            ex.printStackTrace();
            }

        //Desconeccion
        Desconectar(con);

        return p;

    }

    public int obtenerTipoUsuario(long unNumeroDocumento) {
        if(verificarTipo(unNumeroDocumento,"participante"))
            return 0;
        if(verificarTipo(unNumeroDocumento,"administrador"))
            return 1;
        return 2;
    }

    public boolean verificarTipo(long unNumeroDocumento, String tabla){
        Connection con=Conectar();

        boolean estado=false;

        int tam=0;

        //Consulta
        try {
         Statement s = (Statement) con.createStatement();
         // hacer una consulta
         ResultSet rs = s.executeQuery("SELECT * " +
                                       "FROM persona p, "+tabla+" t "+
                                       "WHERE p.nroDocumento= "+unNumeroDocumento
                                       +" AND t.id_persona=p.id_persona;");

         while(rs.next())
             tam++;

         if(tam!=0)
            estado=true;

         // cerrar la conexion..
         con.close();

         } catch (SQLException ex){
            ex.printStackTrace();
            }

        //Desconeccion
        Desconectar(con);

        return estado;
    }

    private String obtenerNombreEquipoFantasia(int iD) {
        Connection con=Conectar();

        String nombre=null;

        int tam=0;

        //Consulta
        try {
         Statement s = (Statement) con.createStatement();
         // hacer una consulta
         ResultSet rs = s.executeQuery("SELECT * " +
                                       "FROM equipofantasia e, participante p "+
                                       "WHERE e.id_participante=p.id_persona "
                                       +"AND p.id_persona= "+iD+";");

         while(rs.next())
             tam++;

         if(tam!=0){
             rs.first();
             nombre=rs.getString("nombre");
         }

         // cerrar la conexion..
         con.close();

         } catch (SQLException ex){
            ex.printStackTrace();
            }

        //Desconeccion
        Desconectar(con);

        return nombre;
    }

    private Fecha obtenerFechaPorId(int idFecha) {
        Connection con=Conectar();

        Fecha fecha=null;

        //Consulta
        try {
         Statement s = (Statement) con.createStatement();
         // hacer una consulta
         ResultSet rs = s.executeQuery("SELECT * " +
                                       "FROM fecha f "+
                                       "WHERE f.id_fecha= "+idFecha+";");

         rs.first();
         fecha=new Fecha(idFecha,rs.getInt("numero"),rs.getInt("estado"));

         // cerrar la conexion..
         con.close();

         } catch (SQLException ex){
            ex.printStackTrace();
            }

        //Desconeccion
        Desconectar(con);

        return fecha;
    }

    private Club obtenerClub(int idJugador) {
        Connection con=Conectar();

        Club club=null;

        //Consulta
        try {
         Statement s = (Statement) con.createStatement();
         // hacer una consulta
         ResultSet rs = s.executeQuery("SELECT * " +
                                       "FROM club c, jugador j "+
                                       "WHERE j.id_club=c.id_club " +
                                       "AND j.id_jugador= "+idJugador+";");

         rs.first();
         club=new Club(rs.getInt("id_club"),rs.getString("nombreC"));

         // cerrar la conexion..
         con.close();

         } catch (SQLException ex){
            ex.printStackTrace();
            }

        //Desconeccion
        Desconectar(con);

        return club;
    }

    void actualizarEquipoModificado(EquipoFantasia equipoActual) {
        Connection con=Conectar();

        //Consulta
        try {
         Statement s = (Statement) con.createStatement();

         // hacer una consulta
         s.executeUpdate("UPDATE equipofantasia " +
                         "SET presupuestoDisponible= "+equipoActual.getPresupuesto()+", " +
                         "cambiosDisponibles= "+equipoActual.getTransferenciasRestantes()+" " +
                         "WHERE id_equipo="+equipoActual.getID()+";");


         // cerrar la conexion..
         con.close();

         } catch (SQLException ex){
            ex.printStackTrace();
            }

        //Desconeccion
        Desconectar(con);
    }

    void actualizarHistoriales(Historial[] historiales) {
        Connection con=Conectar();

        //Consulta
        try {
         Statement s = (Statement) con.createStatement();

         // hacer una consulta
         for(int i=0; i<15; i++)
             {if(historiales[i]!=null)
                    if(historiales[i].getFechaFin()!=null){
                        s.executeUpdate("UPDATE historial " +
                                 "SET id_fechaFinal= "+historiales[i].getFechaFin().getID()+
                                 " WHERE id_equipo="+historiales[i].getIdEquipoFantasia()+" " +
                                        "AND id_jugador="+historiales[i].getIdJugador()+" " +
                                        "AND id_fechaInicial="+historiales[i].getFechaInicio().getID()+";");
                    }   
                    else{
                        s.executeUpdate("UPDATE historial "+
                                        "SET id_jugador= "+historiales[i].getIdJugador()+

                                        " WHERE id_equipo= "+historiales[i].getIdEquipoFantasia()+
                                        " AND posicion="+historiales[i].getPosicion()+
                                        " AND id_fechaInicial="+historiales[i].getFechaInicio().getID()+";");
                    }
             }
         // cerrar la conexion..
         con.close();

         } catch (SQLException ex){
            ex.printStackTrace();
            }

        //Desconeccion
        Desconectar(con);
        
    }

    public void persistirHistorialesNuevos(Historial[] unArrayHistorialesNuevos) {
        Connection con=Conectar();

        //Consulta
        try {
         Statement s = (Statement) con.createStatement();
         // hacer una consulta
         for(int i=0; i<15; i++)
             if( unArrayHistorialesNuevos[i]!=null )
                    s.executeUpdate("insert into historial " +
                        "values ( "+unArrayHistorialesNuevos[i].getIdJugador()+", "
                        +unArrayHistorialesNuevos[i].getIdEquipoFantasia()+", "
                        +unArrayHistorialesNuevos[i].getFechaInicio().getID()+", null, " +
                        +unArrayHistorialesNuevos[i].getPosicion()+");");


         // cerrar la conexion..
         con.close();

         } catch (SQLException ex){
            ex.printStackTrace();
            }

        //Desconeccion
        Desconectar(con);
    }

    public ItemGanador[] obtenerGanadoresDeUnaFecha(int unaFecha) {
        Connection con=Conectar();

        ItemGanador[] ganadores=null;

        int tam=0;

        //Consulta
        try {
         Statement s = (Statement) con.createStatement();
         // hacer una consulta
         ResultSet rs = s.executeQuery("SELECT p.nombre 'nombreG' , p.apellido 'apellidoG' , e.nombre 'nombreEquipo', pe.puntaje 'puntajeG' " +
"FROM equipofantasia e, fechacalificacionjugador f, jugador j, calificacion c, historial h, puntajeequipo pe, persona p, participante pa " +
"WHERE pe.id_equipo=e.id_equipo " +
"and p.id_persona=pa.id_persona " +
"and pa.id_persona=e.id_participante " +
"and pe.id_fecha=f.id_fecha " +
"and j.id_jugador=h.id_jugador " +
"AND h.id_equipo=e.id_equipo " +
"AND c.id_calificacion=f.id_calificacion " +
"AND j.id_jugador=f.id_jugador " +
"AND f.id_fecha= "+unaFecha+" " +
"AND (h.id_fechaInicial<=f.id_fecha AND (h.id_fechaFinal is null OR h.id_fechaFinal>f.id_fecha)) " +
"AND c.jugo20=1 " +
"AND (h.posicion<11 OR (h.posicion>10 and exists (select * " +
                                                  "from historial h2, calificacion c2, fechacalificacionjugador f2, jugador j2 " +
                                                   "where h2.posicion<11 " +
                                                   "and c2.jugo20=0 " +
                                                   "and f2.id_calificacion=c2.id_calificacion " +
                                                   "and j2.id_jugador=f2.id_jugador " +
						   "and f2.id_fecha=f.id_fecha " +
                                                   "and h2.id_jugador=j2.id_jugador " +
                                                   "and j.puesto=j2.puesto " +
                                                   "and e.id_equipo=h2.id_equipo " +
                                                   "and (h2.id_fechaInicial<=f.id_fecha AND (h2.id_fechaFinal is null OR h2.id_fechaFinal>f.id_fecha))))) " +
"GROUP BY e.id_equipo " +
"ORDER BY pe.puntaje DESC, SUM(c.califperiodista) DESC, SUM(c.gc) DESC, SUM(c.tarjeta=2) asc,SUM(c.tarjeta=1) asc;");

         while(rs.next())
             tam++;

         ganadores=new ItemGanador[tam];

         rs.first();
         int i=0;
         do{
            String mejorJugador=obtenerMejorJugador(unaFecha,rs.getString("nombreEquipo"));
            ItemGanador item=new ItemGanador(rs.getString("apellidoG")+", "+rs.getString("nombreG"),
                                    rs.getString("nombreEquipo"), rs.getInt("puntajeG"), mejorJugador);
            ganadores[i]=item;
            i++;
         }while(rs.next());

         // cerrar la conexion..
         con.close();

         } catch (SQLException ex){
            ex.printStackTrace();
            }

        //Desconeccion
        Desconectar(con);

        return ganadores;
    }

    private String obtenerMejorJugador(int unaFecha,String nombreEquipo){
        Connection con=Conectar();

        String mejorJugador="";

        int tam=0;

        //Consulta
        try {
         Statement s = (Statement) con.createStatement();
         // hacer una consulta
         ResultSet rs = s.executeQuery("SELECT distinct j.nombre, j.apellido, c.total, j.cotizacion, c.califperiodista, c.id_calificacion " +
"FROM equipofantasia e, fechacalificacionjugador f, jugador j, calificacion c, historial h " +
"WHERE j.id_jugador=h.id_jugador " +
"AND h.id_equipo=e.id_equipo " +
"AND c.id_calificacion=f.id_calificacion " +
"AND e.nombre= '"+nombreEquipo+"' " +
"AND j.id_jugador=f.id_jugador " +
"AND f.id_fecha= "+unaFecha+" " +
"AND (h.id_fechaInicial<=f.id_fecha AND (h.id_fechaFinal is null OR h.id_fechaFinal>f.id_fecha)) " +
"AND c.jugo20=1 " +
"AND (h.posicion<11 OR (h.posicion>10 and exists (select * " +
                                                  "from historial h2, calificacion c2, fechacalificacionjugador f2, jugador j2 " +
                                                   "where h2.posicion<11 " +
                                                   "and c2.jugo20=0 " +
                                                   "and f2.id_calificacion=c2.id_calificacion " +
                                                   "and j2.id_jugador=f2.id_jugador " +
                                                   "and h2.id_jugador=j2.id_jugador " +
                                                   "and j.puesto=j2.puesto " +
                                                   "and e.id_equipo=h2.id_equipo " +
                                                   "and (h2.id_fechaInicial<=f.id_fecha AND (h2.id_fechaFinal is null OR h2.id_fechaFinal>f.id_fecha))))) " +
"ORDER BY c.total DESC, j.cotizacion ASC, c.califperiodista DESC;");

         rs.first();

         mejorJugador=rs.getString("apellido")+", "+rs.getString("nombre");

         // cerrar la conexion..
         con.close();

         } catch (SQLException ex){
            ex.printStackTrace();
            }

        //Desconeccion
        Desconectar(con);

        return mejorJugador;
    }

    public Partido[] obtenerPartidosDeUnafecha(Fecha unaFecha) {
        Connection con=Conectar();

        Partido[] partidos=null;

        int tam=0;

        //Consulta
        try {
         Statement s = (Statement) con.createStatement();
         // hacer una consulta
         ResultSet rs = s.executeQuery("SELECT * " +
                                        "FROM fecha f, partido p "+
                                        "WHERE p.id_fecha=f.id_fecha " +
                                        "AND f.id_fecha="+unaFecha.getID()+";");

         while(rs.next())
             tam++;

         if(tam!=0){
            partidos=new Partido[tam];

            rs.first();
            int i=0;
            do{
                Club local=instanciarClub(rs.getInt("id_clubL"));
                Club visitante=instanciarClub(rs.getInt("id_clubV"));
                Partido partido=new Partido(rs.getInt("id_partido"), local, visitante);
                partidos[i]=partido;
                i++;
            }while(rs.next());
         }

         // cerrar la conexion..
         con.close();

         } catch (SQLException ex){
            ex.printStackTrace();
            }

        //Desconeccion
        Desconectar(con);
        if(tam!=0){
            Vector<Integer> idsPartidosCerrados=obtenerPartidosCerrados(partidos);

            for(int i=0;i<partidos.length; i++)
                partidos[i].setEstado(pertenece(partidos[i].getId(),idsPartidosCerrados));
        }
        return partidos;
    }

    private boolean pertenece(int id, Vector<Integer> arrayIds){
        return arrayIds.contains((Integer)id);
    }

    private Vector<Integer> obtenerPartidosCerrados(Partido[] partidos) {
        Connection con=Conectar();

        Vector<Integer> partidosCerrados=new Vector<Integer>();

        int tam=0;

        //Consulta
        try {
         Statement s = (Statement) con.createStatement();
         // hacer una consulta

         for(int i=0; i<partidos.length; i++){
            ResultSet rs = s.executeQuery("SELECT p.id_partido " +
                                        "from partido p " +
                                        "where p.id_partido= "+partidos[i].getId()+" " +
                                                "and ((p.estado=1 or p.estado=2) " +
                                                 "or( (exists(select * " +
                                                              "from jugador j, calificacion ca, fechacalificacionjugador fe " +
                                                              "where j.id_club=p.id_clubV " +
                                                                    "and j.id_jugador=fe.id_jugador " +
                                                                    "and fe.id_calificacion=ca.id_calificacion " +
                                                                    "and p.id_fecha=fe.id_fecha " +
                                                                    "and ca.figura=true) " +
                                                                    "and exists(select * " +
                                                                                "from jugador j2, calificacion ca2, fechacalificacionjugador fe2 " +
                                                                                "where j2.id_club=p.id_clubL " +
                                                                                        "and j2.id_jugador=fe2.id_jugador " +
                                                                                        "and fe2.id_calificacion=ca2.id_calificacion " +
                                                                                        "and p.id_fecha=fe2.id_fecha)) " +
                                                      "or (exists(select * " +
                                                                 "from jugador j3, calificacion ca3, fechacalificacionjugador fe3 " +
                                                                 "where j3.id_club=p.id_clubL " +
                                                                       "and j3.id_jugador=fe3.id_jugador " +
                                                                       "and fe3.id_calificacion=ca3.id_calificacion " +
                                                                       "and p.id_fecha=fe3.id_fecha " +
                                                                       "and ca3.figura=true) " +
                                                                       "and exists(select * " +
                                                                                    "from jugador j4, calificacion ca4, fechacalificacionjugador fe4 " +
                                                                                    "where j4.id_club=p.id_clubV " +
                                                                                            "and j4.id_jugador=fe4.id_jugador " +
                                                                                            "and fe4.id_calificacion=ca4.id_calificacion " +
                                                                                            "and p.id_fecha=fe4.id_fecha))));");

         while(rs.next())
             tam++;
         if(tam!=0){
            rs.first();
            partidosCerrados.add(rs.getInt("id_partido"));
         }
         }
         // cerrar la conexion..
         con.close();

         } catch (SQLException ex){
            ex.printStackTrace();
            }

        //Desconeccion
        Desconectar(con);

        return partidosCerrados;
    }

    public void cerrarFecha(int idFecha) {
        Connection con=Conectar();

        //Consulta
        try {
         Statement s = (Statement) con.createStatement();

         // hacer una consulta
         s.executeUpdate("UPDATE fecha " +
                         "SET estado=0 " +
                         "WHERE id_fecha= "+idFecha+";");


         // cerrar la conexion..
         con.close();

         } catch (SQLException ex){
            ex.printStackTrace();
            }

        //Desconeccion
        Desconectar(con);
    }

    public Participante[] instanciarParticipantes() {
        Connection con=Conectar();

        Participante[] participantes=null;

        int tam=0;

        //Consulta
        try {
         Statement s = (Statement) con.createStatement();
         // hacer una consulta
         ResultSet rs = s.executeQuery("select * " +
                                       "from persona pe, participante pa, equipofantasia e " +
                                       "where pe.id_persona=pa.id_persona " +
                                             "AND e.id_participante=pa.id_persona ;");

         while(rs.next())
             tam++;

         participantes=new Participante[tam];

         rs.first();
         int i=0;
         do{
            participantes[i]=new Participante(rs.getInt("id_persona"),rs.getString("apellido"), rs.getString("nombre"),
                rs.getLong("nroDocumento"), rs.getString("contrasenia"), rs.getString("sexo").charAt(0),
                rs.getString("tipoDocumento"), rs.getString("fechaNacimiento"),
                rs.getString("calle")+" "+rs.getInt("numero")+" "+rs.getInt("piso")+" "+rs.getInt("manzana")+" "+rs.getInt("depto"),
                rs.getString("email"), rs.getString("fechaRegistro"), rs.getString("horaRegistro"));

            participantes[i].setNombreEquipo(obtenerNombreEquipoFantasia(rs.getInt("id_persona")));

            i++;
         }while(rs.next());

         // cerrar la conexion..
         con.close();

         } catch (SQLException ex){
            ex.printStackTrace();
            }

        //Desconeccion
        Desconectar(con);

        return participantes;
    }

    public Calificacion obtenerCalificacion(int idJugador,int idFecha){
        Connection con=Conectar();

        Calificacion calif=null;

        //Consulta
        try {
         Statement s = (Statement) con.createStatement();
         // hacer una consulta
         ResultSet rs = s.executeQuery("SELECT * " +
                                       "FROM calificacion c, fechacalificacionjugador f "+
                                       "WHERE f.id_fecha= "+idFecha+" " +
                                             "AND f.id_jugador= "+idJugador+" " +
                                             "AND f.id_calificacion=c.id_calificacion;");

         rs.first();
         calif=new Calificacion(rs.getInt("id_calificacion"), rs.getInt("gc"), rs.getInt("gr"),
            rs.getInt("pe"), rs.getInt("pc"), rs.getInt("pa"), rs.getInt("gec"),
            rs.getBoolean("jugo20"), rs.getInt("tarjeta"), rs.getInt("califperiodista"),
            rs.getInt("total"), rs.getBoolean("figura"));

         // cerrar la conexion..
         con.close();

         } catch (SQLException ex){
            ex.printStackTrace();
            }

        //Desconeccion
        Desconectar(con);

        return calif;
    }

    /**
     * Actualiza el puntajeTotal del equipo pasado como parámetro
     * @param equipo_i
     */
    public void persistirEquipoFantasia(EquipoFantasia equipo_i) {
        Connection con=Conectar();

        //Consulta
        try {
         Statement s = (Statement) con.createStatement();

         // hacer una consulta
         s.executeUpdate("UPDATE equipofantasia " +
                         "SET puntajetotal= "+equipo_i.getPuntajeTotal()+" " +
                         "WHERE id_equipo= "+equipo_i.getID()+" ;");


         // cerrar la conexion..
         con.close();

         } catch (SQLException ex){
            ex.printStackTrace();
            }

        //Desconeccion
        Desconectar(con);
    }

    public void persistirPuntajeDeEquipoEnFecha(EquipoFantasia equipo_i, Fecha unaFecha) {
        Connection con=Conectar();

        //Consulta
        try {
         Statement s = (Statement) con.createStatement();

         // hacer una consulta
         s.executeUpdate("insert into puntajeequipo " +
                         "values( "+unaFecha.getID()+", "+equipo_i.getID()+", " +
                                  equipo_i.obtenerPuntajeTotalJugadores(unaFecha.getNumeroFecha())+") ;");

         // cerrar la conexion..
         con.close();

         } catch (SQLException ex){
            ex.printStackTrace();
            }

        //Desconeccion
        Desconectar(con);
    }

    void actualizarPuntajeTotalJugador(Calificacion calificacionEnFecha) {

    Connection con=Conectar();

        //Consulta
        try {
         Statement s = (Statement) con.createStatement();

         // hacer una consulta
          s.executeUpdate("UPDATE calificacion " +
                         "SET total= "+calificacionEnFecha.getTotal()+" " +
                         "WHERE id_calificacion= "+calificacionEnFecha.getId()+" ;");

         // cerrar la conexion..
         con.close();

         } catch (SQLException ex){
            ex.printStackTrace();
            }

        //Desconeccion
        Desconectar(con);
    }

}